#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#pragma once
#include <QMainWindow>
#include <QTimer>
#include <QElapsedTimer>
#include <QButtonGroup>
#include <QAbstractButton>
#include <QPushButton>
#include <QList>
#include <QByteArray>
#include <QString>

// Строгие константы PDU из руководства интегратора ориентатора (адрес 0x01)
#define PDU_ALIGN_X_CURRENT_POS     30
#define PDU_ALIGN_X_TARGET_POS      31
#define PDU_ALIGN_R_TARGET_POS      36
#define PDU_ALIGN_Z_TARGET_POS      42
#define PDU_START_ALIGN             56
#define PDU_ALIGN_PUMP_ENABLE       57
#define PDU_ALIGN_FSM_STOP          77
#define PDU_ALIGN_FSM_RESET         78
#define PDU_ALIGN_FSM_STATUS        79
#define PDU_ALIGN_FSM_STATE         80
#define PDU_ALIGN_FSM_ERROR         81
#define PDU_REG_HOME_COMMAND        82
#define PDU_REG_HOME_AXES           83
#define PDU_REG_HOME_STATUS         84
#define PDU_REG_HOME_ERROR          85
#define PDU_REG_HOME_TIMEOUT_MS     86
#define PDU_Z_REFERENCE_VALID      389
#define PDU_Z_WORK_DOWN            390
#define PDU_Z_WORK_UP              391

// Константы индексов матриц портов eBox
#define EBOX_PORT_ROBOT         0
#define EBOX_PORT_ALIGNER       1
#define EBOX_PORT_CONTROL_BOARD 2

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    // Системные слоты
    void slotInitHardwarePorts();
    void slotHandleAutoReconnect();
    void slotTimer();
    void ReadFromPorts();

    // Сценарии манипулятора
    void slotP1ERob();
    void slotP2ERob();
    void slotDeInitERob();
    void slotZp();
    void slotZm();
    void slotSave();
    void slotSaveZ();
    void slotGetAngle();
    void slotGetEncoder();
    void slotGetXY();
    void slotGetPressure();

    // Заглушки под интерфейс формы
    void slotP3ERob(); void slotP4ERob(); void slotP5ERob();
    void slotOnPushLoadEnc(); void slotParkERob(bool checked);
    void slotCbxOpenPort(); void slotAlignFactoryHome();
    void slotHandleEllipsometerNetworkData();
    void stopAllSystemsEmergency(const QString &reason);
    void slotAdvancedEposMachine();

    // Управление ориентатором
    void slotAlignStart();
    void slotAlignStop();
    void slotAlignPumpOnOff(bool toggled);
    void slotMoveCorrect(bool toggled);
    void slotValveOnOff(bool toggled);
    void slotMultyBtn(QAbstractButton* button, bool checked);

    // Ручные шаги перемещений
    void slotOnPushR1p(); void slotOnPushR1m();
    void slotOnPushR2p(); void slotOnPushR2m();
    void slotOnPushR3p(); void slotOnPushR3m();
    void slotOnPush_dXplus();  void slotOnPush_dXminus();
    void slotOnPush_dYplus();  void slotOnPush_dYminus();
    void slotCbxStep(); void slotCbxStepXY(); void slotCbxStepZ();

private:
    Ui::MainWindow *ui;
    int fd_matrix[4];

    QTimer *timer;
    QTimer *uiRefreshTimer;
    QTimer *reconnectTimer;

    int testScenarioStep;
    int activeRouteNumber;
    int _step;

    bool isRobotBusy;
    bool isAlignerBusy;
    bool isControlBoardBusy;

    QElapsedTimer workElapsedTimer;
    qint64 totalActiveTimeMs;

    quint16 calculateCRC(const QByteArray &data);
    bool configureTermios(int fd);
    void updateWorkTimerLogic();
    bool isAnyModuleWorking() const { return isRobotBusy || isAlignerBusy || isControlBoardBusy; }

    void sendRobotRegister(quint16 reg, quint16 value);
    void sendAlignerRegister(quint16 reg, quint16 value);
    void sendRobotReadRequest(quint16 reg, quint16 count);
    void parseRobotResponse(const QByteArray &packet);

    void runRoute1Machine();
    void runRoute2Machine();

    QButtonGroup *_group;
    QList<QPushButton*> _listButtons;
};

#endif // MAINWINDOW_H
